﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Crosland.Automotriz.Logic;
using Crosland.Automotriz.Core;
using Crosland.Automotriz.Logic.Linq;
using Crosland.Automotriz.Facade.Facade;
using Crosland.Automotriz.Facade.Interface;
using System.Net.Mail;
using System.Configuration;
using Crosland.Automotriz.Logic.ControlExeption;
using System.Data.SqlClient;
using Crosland.Automotriz.Logic.Funciones;
namespace Crosland.Automotriz.Web.Repuestos
{
    public partial class wFrmProcesarArticulosABCGenerar : System.Web.UI.Page
    {
        iFacadeProcesarABC BL_ProcesarABC = new FacadeProcesarABC();
        string idNegocio = ConfigurationManager.AppSettings["Negocio"];
        //Logg clsError = null;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ScriptManager.RegisterStartupScript(this, typeof(Page), "carga", "JavaScript:confirmSubmitResult();", true);
                cboMes.Value = Convert.ToInt32(System.DateTime.Now.Month);
                cboAnio.Value = Convert.ToInt32(System.DateTime.Now.Year);
                this.listarEmail();
                cboPeriFinAnio.Value = Convert.ToString(DateTime.Now.Year);
                cboPeriFinMes.Value = Convert.ToString((DateTime.Now.Month) - 1);
                this.PeriodoFinal();
            }
        }



        private void procesarAbc()
        {


            try
            {

                int id_org_vta = 2;

                string peri_ini_venta = Convert.ToString(cboPeriIniAnio.Value) + LeftRightMid.Right("00" + Convert.ToString(cboPeriIniMes.Value), 2);
                string peri_fin_venta = Convert.ToString(cboPeriFinAnio.Value) + LeftRightMid.Right("00" + Convert.ToString(cboPeriFinMes.Value), 2);

                //Rangos de Valorizado
                double a_desde = Convert.ToDouble(txtCatAdesde.Text);
                double a_hasta = Convert.ToDouble(txtCatAhasta.Text);
                double b_desde = Convert.ToDouble(txtCatBdesde.Text);
                double b_hasta = Convert.ToDouble(txtCatBhasta.Text);
                double c1_desde = Convert.ToDouble(txtCatC1desde.Text);
                double c1_hasta = Convert.ToDouble(txtCatC1hasta.Text);
                double c2_desde = Convert.ToDouble(txtCatC2desde.Text);
                double c2_hasta = Convert.ToDouble(txtCatC2hasta.Text);
                double c3_desde = Convert.ToDouble(txtCatC3desde.Text);
                double c3_hasta = Convert.ToDouble(txtCatC3hasta.Text);
                double c4_desde = Convert.ToDouble(txtCatC4desde.Text);
                double c4_hasta = Convert.ToDouble(txtCatC4hasta.Text);
                double c5_desde = Convert.ToDouble(txtCatC5desde.Text);
                double c5_hasta = Convert.ToDouble(txtCatC5hasta.Text);

                //Rangos de Cantidad

                double a_desde_can = Convert.ToDouble(txtCatAdesde_CAN.Text);
                double a_hasta_can = Convert.ToDouble(txtCatAhasta_CAN.Text);
                double b_desde_can = Convert.ToDouble(txtCatBdesde_CAN.Text);
                double b_hasta_can = Convert.ToDouble(txtCatBhasta_CAN.Text);
                double c1_desde_can = Convert.ToDouble(txtCatC1desde_CAN.Text);
                double c1_hasta_can = Convert.ToDouble(txtCatC1hasta_CAN.Text);
                double c2_desde_can = Convert.ToDouble(txtCatC2desde_CAN.Text);
                double c2_hasta_can = Convert.ToDouble(txtCatC2hasta_CAN.Text);
                double c3_desde_can = Convert.ToDouble(txtCatC3desde_CAN.Text);
                double c3_hasta_can = Convert.ToDouble(txtCatC3hasta_CAN.Text);
                double c4_desde_can = Convert.ToDouble(txtCatC4desde_CAN.Text);
                double c4_hasta_can = Convert.ToDouble(txtCatC4hasta_CAN.Text);
                double c5_desde_can = Convert.ToDouble(txtCatC5desde_CAN.Text);
                double c5_hasta_can = Convert.ToDouble(txtCatC5hasta_CAN.Text);

                string cod_usuario = Session["User"].ToString();
                string abc_desde_hasta_ven = "A" + LeftRightMid.Right("000" + a_desde.ToString(), 3) + "A" + LeftRightMid.Right("000" + a_hasta.ToString(), 3) + "B" + LeftRightMid.Right("000" + b_desde.ToString(), 3) + "B" + LeftRightMid.Right("000" + b_hasta.ToString(), 3) + "C1" + LeftRightMid.Right("000" + c1_desde.ToString(), 3) + "C1" + LeftRightMid.Right("000" + c1_hasta.ToString(), 3) + "C2" + LeftRightMid.Right("000" + c2_desde.ToString(), 3) + "C2" + LeftRightMid.Right("000" + c2_hasta.ToString(), 3) + "C3" + LeftRightMid.Right("000" + c3_desde.ToString(), 3) + "C3" + LeftRightMid.Right("000" + c3_hasta.ToString(), 3) + "C4" + LeftRightMid.Right("000" + c4_desde.ToString(), 3) + "C4" + LeftRightMid.Right("000" + c4_hasta.ToString(), 3) + "C5" + LeftRightMid.Right("000" + c5_desde.ToString(), 3) + "C5" + LeftRightMid.Right("000" + c5_hasta.ToString(), 3);
                string abc_desde_hasta_can = "A" + LeftRightMid.Right("000" + a_desde_can.ToString(), 3) + "A" + LeftRightMid.Right("000" + a_hasta_can.ToString(), 3) + "B" + LeftRightMid.Right("000" + b_desde_can.ToString(), 3) + "B" + LeftRightMid.Right("000" + b_hasta_can.ToString(), 3) + "C1" + LeftRightMid.Right("000" + c1_desde_can.ToString(), 3) + "C1" + LeftRightMid.Right("000" + c1_hasta_can.ToString(), 3) + "C2" + LeftRightMid.Right("000" + c2_desde_can.ToString(), 3) + "C2" + LeftRightMid.Right("000" + c2_hasta_can.ToString(), 3) + "C3" + LeftRightMid.Right("000" + c3_desde_can.ToString(), 3) + "C3" + LeftRightMid.Right("000" + c3_hasta_can.ToString(), 3) + "C4" + LeftRightMid.Right("000" + c4_desde_can.ToString(), 3) + "C4" + LeftRightMid.Right("000" + c4_hasta_can.ToString(), 3) + "C5" + LeftRightMid.Right("000" + c5_desde_can.ToString(), 3) + "C5" + LeftRightMid.Right("000" + c5_hasta_can.ToString(), 3);

                int anio = Convert.ToInt32(cboAnio.SelectedItem.Value);
                int mes = Convert.ToInt32(cboMes.SelectedItem.Value);
                int Meses_N = Convert.ToInt32(txtCatN.Text);
                int Meses_O = Convert.ToInt32(txtCatO.Text);

                if (BL_ProcesarABC.procesar_ABC(id_org_vta, peri_ini_venta, peri_fin_venta, abc_desde_hasta_ven, abc_desde_hasta_can, cod_usuario, anio, mes, Meses_N, Meses_O))
                {
                    this.enviarEmail();
                    lblmsj.Text = "Asignación de artículos ABC, procesada satisfactoriamente...! ";
                    popupMsj.ShowOnPageLoad = true;
                }

            }

            catch (DataException ex)
            {
                GuardarExceptionLog(ex.Message, ex, "ProcesarABC");
                MensajesError(ex.Message, ex, "ProcesarABC");
            }
            catch (RunException e)
            {
               // GuardarExceptionLog(e.Message, e, "ProcesarABC");
                MensajesError(e.Message, e, "ProcesarABC");
            }
        }


        private void GuardarExceptionLog(String msgUsu, Exception ex, String metError)
        {
            try
            {
                String msgReal, fhError, pagError, codUsu;
                msgReal = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message;
                pagError = new System.IO.FileInfo(Page.Request.Url.AbsolutePath).Name;
                codUsu = Session["User"].ToString();
                fhError = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");

                System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
                int number = 0;
                for (int i = 0; i < trace.FrameCount; i++)
                {
                    System.Diagnostics.StackFrame sf = trace.GetFrame(i);
                    number = sf.GetFileLineNumber();
                }
                fhError = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
                new Logg().ErrorLog(Server.MapPath("~/Logs/ErrorLog.csv"), msgUsu, msgReal, pagError, metError, codUsu, number);
            }
            catch (DataException e)
            {

                MensajesError(e.Message, e, "GuardarExceptionLog");
            }
            catch (RunException re) {
                MensajesError(re.Message, re, "GuardarExceptionLog");
            }      
               
        }

        private void MensajesError(String msgUsu, Exception ex, String metError)
        {

            Crosland.Automotriz.Web.UserControl.MensajeError uc = (Crosland.Automotriz.Web.UserControl.MensajeError)Master.FindControl("ucErrorMensaje");
            String msgReal, fhError, pagError, codUsu;
            msgReal = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message;
            pagError = new System.IO.FileInfo(Page.Request.Url.AbsolutePath).Name;
            codUsu = Session["User"].ToString();
            fhError = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
            System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
            int number = 0;
            for (int i = 0; i < trace.FrameCount; i++)
            {
                System.Diagnostics.StackFrame sf = trace.GetFrame(i);
                number = sf.GetFileLineNumber();
            }
            uc.Errores(msgUsu, msgReal, fhError, pagError, metError, codUsu, number);          
            
        }






     

        protected void btnsalir2_Click(object sender, EventArgs e)
        {
          
            Response.Redirect("~/Repuestos/wFrmProcesarArticulosABC.aspx?id=" + idNegocio);
        }

        protected void btnprocesar2_Click(object sender, EventArgs e)
        {
            this.ProcesarABCValidacion();
        }

        private void ProcesarABCValidacion()
        {

            if (cboMes.SelectedIndex == 0 || cboAnio.SelectedIndex == 0 || txtCatAhasta.Text == string.Empty || txtCatBhasta.Text == string.Empty)
            {
                lblmsj.Text = String.Empty;
                lblmsj.Text = "Seleccione y/o ingrese los campos requeridos !";
                popupMsj.ShowOnPageLoad = true;

            }
            else
            {

                if (Convert.ToInt32(txtCatAhasta.Text.Trim()) >= 100)
                {
                    lblmsj.Text = "El campo A hasta debe ser mayor o igual que 100";
                    popupMsj.ShowOnPageLoad = true;
                }
                else if (Convert.ToInt32(txtCatAhasta.Text.Trim()) >= Convert.ToInt32(txtCatBhasta.Text.Trim()))
                {
                    lblmsj.Text = "El campo A hasta debe ser mayor o igual que B hasta";
                    popupMsj.ShowOnPageLoad = true;

                }
                else if (Convert.ToInt32(txtCatBhasta.Text.Trim()) > 100)
                {
                    lblmsj.Text = "El campo B hasta debe ser mayor que 100";
                    popupMsj.ShowOnPageLoad = true;
                }
                else
                {
                    try
                    {
                        if (BL_ProcesarABC.ValidaProcesoxmes(Convert.ToInt32(cboAnio.SelectedItem.Value), Convert.ToInt32(cboMes.SelectedItem.Value)) == 0)
                        {
                            this.procesarAbc();
                        }
                        else
                        {
                            lblmsj.Text = String.Empty;
                            lblmsj.Text = "Ya ha sido procesado este mes";
                            popupMsj.ShowOnPageLoad = true;
                        }

                    }
                    catch (RunException ex)
                    {
                        GuardarExceptionLog(ex.Message, ex, "ProcesarABCValidacion");
                        MensajesError(ex.Message, ex, "ProcesarABCValidacion");
                    }

                }

            }

        }


        private void listarEmail()
        {
            try
            {
                gvEmail.DataSource = BL_ProcesarABC.ListT_mae_proceso_abc_correo();
                gvEmail.DataBind();
            }
            catch (DataException ex)
            {
                GuardarExceptionLog(ex.Message, ex, "listarEmail");
                MensajesError("ERROR DATA", ex, "listarEmail");
            }
            catch (RunException e)
            {
                GuardarExceptionLog(e.Message, e, "listarEmail");
                MensajesError("ERROR RUN", e, "listarEmail");
            }


        }

        private MailMessage mail = new MailMessage();

        private void enviarEmail()
        {
            Crosland.Automotriz.Seguridad.Business.clsUsuarioLogic usu = new Crosland.Automotriz.Seguridad.Business.clsUsuarioLogic();
            Crosland.Automotriz.Seguridad.Entity.T_SEG_USUARIO usuario = usu.listarUser(Session["User"].ToString())[0];
            string nombre_apellido = usuario.DES_NOMBRE + " " + usuario.DES_APELLIDOS;
            try
            {
                for (int i = 0; i < gvEmail.VisibleRowCount; i++)
                {

                    string row = (string)(gvEmail.GetRowValues(i, "DES_EMAIL")).ToString();
                    mail.From = new MailAddress(ConfigurationManager.AppSettings["MailFrom"], ConfigurationManager.AppSettings["UserNameSMTP"]);
                    mail.Subject = ("Categorización de Artículos");
                    mail.Body = String.Format(HtmlEmail.HtmlNotificacionCategorizacionArticulo, "Se acaba de realizar el proceso de categorizacion de articulos.", cboAnio.Text, cboMes.Text, nombre_apellido, txtCatAdesde.Text, txtCatAhasta.Text, txtCatBdesde.Text, txtCatBhasta.Text, txtCatC1desde.Text, txtCatC1hasta.Text,
                                              txtCatC2desde.Text, txtCatC2hasta.Text, txtCatC3desde.Text, txtCatC3hasta.Text, txtCatC4desde.Text, txtCatC4hasta.Text, txtCatC5desde.Text, txtCatC5hasta.Text, txtCatAdesde_CAN.Text, txtCatAhasta_CAN.Text, txtCatBdesde_CAN.Text, txtCatBhasta_CAN.Text,
                                              txtCatC1desde_CAN.Text, txtCatC1hasta_CAN.Text, txtCatC2desde_CAN.Text, txtCatC2hasta_CAN.Text, txtCatC3desde_CAN.Text, txtCatC3hasta_CAN.Text, txtCatC4desde_CAN.Text, txtCatC4hasta_CAN.Text, txtCatC5desde_CAN.Text, txtCatC5hasta_CAN.Text);
                    mail.IsBodyHtml = true;
                    mail.To.Add(row);
                    SmtpClient s = new SmtpClient();
                    s.Host = ConfigurationManager.AppSettings["EmailServer"];
                    s.Port = 25;
                    s.EnableSsl = false;
                    s.UseDefaultCredentials = false;
                    s.Credentials = new System.Net.NetworkCredential(ConfigurationManager.AppSettings["MailFrom"], ConfigurationManager.AppSettings["PasswordSMTP"]);
                    s.Send(mail);
                }
            }
            catch (RunException ex)
            {
                lblmsj.Text = "EROR AL ENVIAR E-MAIL : " + ex.Message;
                popupMsj.ShowOnPageLoad = true;
            }
        }






        private void PeriodoInicial()
        {
            int mes_d = Convert.ToInt32(cboPeriIniMes.Value);
            int num_mes = (mes_d + Convert.ToInt32(txtNumMeses.Number)) - 1;
            if (num_mes > 12)
            {
                int mes_to = (Convert.ToInt32(cboPeriIniMes.Value)) + Convert.ToInt32(txtNumMeses.Number) - 1;
                int meses = mes_to - 12;
                cboPeriFinMes.Value = Convert.ToString(meses);
                int num_anio = Convert.ToInt32(cboPeriIniAnio.Value);
                cboPeriFinAnio.Value = (num_anio + 1).ToString();
            }
            else
            {
                cboPeriFinMes.Value = Convert.ToString(num_mes);
                cboPeriFinAnio.Value = cboPeriIniAnio.Value;
            };

        }

        private void PeriodoFinal()
        {

            int mes_d = Convert.ToInt32(cboPeriFinMes.Value);
            int num_mes = (mes_d - Convert.ToInt32(txtNumMeses.Number)) + 1;
            if (num_mes < 1)
            {
                int mes_to = 12 + Convert.ToInt32(cboPeriFinMes.Value) - Convert.ToInt32(txtNumMeses.Number) + 1;
                cboPeriIniMes.Value = Convert.ToString(mes_to);
                int num_anio = Convert.ToInt32(cboPeriFinAnio.Value);
                cboPeriIniAnio.Value = (num_anio - 1).ToString();
            }
            else
            {
                cboPeriIniMes.Value = Convert.ToString(num_mes);
                cboPeriIniAnio.Value = cboPeriFinAnio.Value;
            };

        }




        protected void gvEmail_AfterPerformCallback(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewAfterPerformCallbackEventArgs e)
        {
            listarEmail();
        }

        protected void cboPeriIniAnio_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.PeriodoInicial();
        }

        protected void cboPeriFinAnio_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.PeriodoFinal();
        }

        protected void cboPeriIniMes_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.PeriodoInicial();
        }

        protected void cboPeriFinMes_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.PeriodoFinal();
        }

        protected void txtNumMeses_NumberChanged(object sender, EventArgs e)
        {
            this.PeriodoFinal();
        }



    }
}